package com.pithypan.service;


import com.pithypan.dto.SessionWebUserDto;
import com.pithypan.dto.UploadResultDto;
import com.pithypan.entity.FileInfo;
import com.pithypan.vo.FileInfoQuery;
import com.pithypan.vo.PaginationResultVo;
import org.springframework.web.multipart.MultipartFile;

import java.security.PublicKey;
import java.util.List;

/**
 * <p>
 * 文件信息 服务类
 * </p>
 *
 * @author author
 * @since 2023-11-23
 */
public interface FileInfoService {


    /**
     * 分页查询文件
     * @param query
     * @return
     */
    public PaginationResultVo findListByPage(FileInfoQuery query);


    /**
     * 上传文件
     * @param webUserDto 登陆用户信息
     * @param fileId     文件id
     * @param file       文件的分片
     * @param fileName   文件名
     * @param filePid    文件父级id
     * @param fileMd5    文件Md5值
     * @param chunkIndex 当前上传的是第几分片
     * @param chunks     文件总分片
     */
    public UploadResultDto uploadFile(SessionWebUserDto webUserDto, String fileId, MultipartFile file,
                       String fileName, String filePid, String fileMd5, Integer chunkIndex, Integer chunks);


    /**
     * 根据 文件id 和 用户id 查询文件
     * @param fileId
     * @param userId
     * @return
     */
    public FileInfo getFileInfoByFileIdAndUserId(String fileId, String userId);


    /**
     * 新建目录
     * @param userId         用户id
     * @param filePid        目录的父级id
     * @param foloderName    目录名称
     * @return
     */
    public FileInfo newFoloder(String userId, String filePid, String foloderName);


    /**
     * 修改文件名称
     * @param userId
     * @param fileId
     * @param fileName
     * @return
     */
    public FileInfo rename(String userId, String fileId, String fileName);


    /**
     * 根据条件查询文件
     * @param infoQuery
     * @return
     */
    public List<FileInfo> findListByParam(FileInfoQuery infoQuery);


    /**
     * 移动文件
     * @param userId
     * @param fileIds   需要移动的文件id
     * @param filePid   移动目的地
     */
    public void changeFileFolder(String userId, String fileIds, String filePid);


    /**
     * 删除文件（修改del_flag字段）
     * @param userId
     * @param fileIds
     */
    public void removeFile2RecycleBatch(String userId, String fileIds);


    /**
     * 从回收站中还原文件
     * @param userId
     * @param fileIds
     */
    public void recoverFileBatch(String userId, String fileIds);


    /**
     * 彻底删除文件（从数据库中删除）
     * @param userId
     * @param fileIds
     * @param adminOp   是否为管理员执行此方法
     */
    public void delFileBatch(String userId, String fileIds, Boolean adminOp);


    /**
     * 查询文件，且关联查询用户名
     * @param query
     * @return
     */
    public PaginationResultVo findFileAndNickName(FileInfoQuery query);


    /**
     * 判断 要进入的目录 是否是 分享文件 的子文件或孙文件（不是则抛异常）
     * @param rootFilePid  分享文件的fileId
     * @param userId       用户Id
     * @param fileId       要进入的目录fileId
     */
    public void checkRootFilePid(String rootFilePid, String userId, String fileId);


    /**
     * 将分享文件保存到网盘
     * @param shareRootFilePid  分享文件的shareId
     * @param shareFileIds      选中的文件（分享的可能是一个目录，里面有多个文件）
     * @param myFolderId        保存的目的地
     * @param shareUserId       分享文件的用户
     * @param currentUserId     保存的用户
     */
    public void saveShare(String shareRootFilePid, String shareFileIds, String myFolderId, String shareUserId, String currentUserId);
}
